# -*- coding: utf-8 -*-

import os, datetime, time, re
import commonlib, traceback
import workerpool
from MongoDbLog import MongoDbLog
from MongoModel import MongoModel

LOG = MongoDbLog('xoso_ketqua_net', 'debug')


class KQNet(MongoModel):
    __province = {'mb': 'Truyền Thống', 'tth': 'Thừa Thiên Huế', 'bdi': 'Bình Định', 'dlc': 'Đắc Lắc', 'dna': 'Đà Nẵng', 'dno': 'Đắc Nông', 
                 'gl': 'Gia Lai', 'kh': 'Khánh Hòa', 'kt': 'Kon Tum', 'qt': 'Quảng Trị', 'qna': 'Quảng Nam', 'qng': 'Quảng Ngãi', 'qb': 'Quảng Bình', 
                 'py': 'Phú Yên', 'nt': 'Ninh Thuận', 'la': 'Long An', 'dlt': 'Đà Lạt', 'hg': 'Hậu Giang', 'bp': 'Bình Phước', 'vl': 'Vĩnh Long', 
                 'tv': 'Trà Vinh', 'dni': 'Đồng Nai', 'ct': 'Cần Thơ', 'st': 'Sóc Trăng', 'btr': 'Bến Tre', 'vt': 'Vũng Tàu', 'bl': 'Bạc Liêu', 
                 'bth': 'Bình Thuận', 'tn': 'Tây Ninh', 'ag': 'An Giang', 'hcm': 'Hồ Chí Minh', 'dt': 'Đồng Tháp', 'cm': 'Cà Mau', 'tg': 'Tiền Giang', 
                 'kg': 'Kiên Giang', 'bdu': 'Bình Dương'}
    
    __mien = {'mien-bac': {'name': 'Miền Bắc', 'province': ['mb']},
        'mien-trung': {'name': 'Miền Trung', 'province': ['bdi', 'dna', 'dlc', 'dno', 'gl', 'kh', 'kt', 'nt', 'py', 'qb', 'qng', 'qna', 'qt', 'tth']},
        'mien-nam': {'name': 'Miền Nam', 'province': ['ag', 'bl', 'btr', 'bdu', 'bp', 'bth', 'cm', 'ct', 'dlt', 'dni', 'dt', 'hg', 'hcm', 'kg', 'la', 'st', 'tn', 'tg', 'tv', 'vl', 'vt']}
        }
    
    __open = [['mb', 'py', 'tth', 'cm', 'dt', 'hcm'],               # Thu 2
        ['mb', 'dlc', 'qna', 'bl', 'btr', 'vt'],                    # Thu 3
        ['mb', 'dna', 'kh', 'ct', 'dni', 'st'],                     # Thu 4
        ['mb', 'bdi', 'qb', 'qt', 'ag', 'bth', 'tn'],               # Thu 5
        ['mb', 'gl', 'nt', 'bdu', 'tv', 'vl'],                      # Thu 6
        ['mb', 'dna', 'dno', 'qng', 'bp', 'hcm', 'hg', 'la'],       # Thu 7
        ['mb', 'kh', 'kt', 'kg', 'tg']]                             # Chu Nhat

    __dbName = 'xoso'
        
    def __init__(self, host='localhost', port=27017):
        MongoModel.__init__(self, host, port)
    
    def getProvinceId(self, name):
        name = commonlib.encodeUTF8Str(name)
        for i, v in self.__province.items():
            if v == name: return i
        return ''
    
    def getRegionName(self, ma):
        for i, v in self.__mien.items():
            for j in v['province']:
                if j == ma:
                    return self.__mien[i]['name']
        return ''
    
    def nameOfDayOfWeek(self, idx):
        tpl = ['Thứ Hai', 'Thứ Ba', 'Thứ Tư', 'Thứ Năm', 'Thứ Sáu', 'Thứ Bảy', 'Chủ Nhật']
        return tpl[idx] if idx < 7 else ''
       
    def dayOfWeek(self):
        return datetime.datetime.now().weekday()
    
    def saveLichOpen(self):
        db = self.connection['xoso']
        collection = db['lichopen']
        for i in range(len(self.__open)):
            data = []
            for j in self.__open[i]:
                data.append({'ma': j, 'name': self.__province[j]})
            collection.save({'_id': i, 'date': self.nameOfDayOfWeek(i), 'list': data})
            
    def generateUrl(self, ma):
        tpl = "http://ketqua.net/xo-so/{mien}/xo-so-{gd}.php"
        gd = commonlib.replaceStr(r'\s', '-', commonlib.toAscii(self.__province[ma]).lower())
        for i, v in self.__mien.items():
            for j in v['province']:
                if ma == j:
                    return tpl.format(mien=i, gd=gd), i
        return ''
    
    def standardizeTimeStr(self, timeStr):
        pat = r'(\d+)/(\d+)/(\d+)'
        preg = re.compile(pat)
        m = preg.search(timeStr)
        if m != '':
            return datetime.datetime(int(m.group(3)), int(m.group(2)), int(m.group(1)))
        return ''
        
    def processXoso(self, ma):
        LOG.debug('start processXoso(%s)' % ma)
        url, mien = self.generateUrl(ma)
        if url == '' or mien == '': return ''
        try:
            tree = commonlib.getXMLTree(url)
            timeStr = commonlib.getElementText(tree.xpath(".//h2[contains(., 'Mở thưởng')]".decode('utf-8')))
            wrapper = {'DB': 'Đặc Biệt', 'G1': 'Giải Nhất', 'G2': 'Giải Nhì', 'G3': 'Giải Ba', 'G4': 'Giải Tư', 'G5': 'Giải Năm', 'G6': 'Giải Sáu', 'G7': 'Giải Bảy', 'G8': 'Giải Tám'}
            ketqua = {}
            for i, v in wrapper.items():
                e = tree.xpath("//h3[contains(., '{0}')]/../following-sibling::*".format(v).decode('utf-8'))
                data = ''
                for ig in e:
                    data += commonlib.getElementText(ig) + '-'
                data = data[:-1]
                ketqua[i] = data
            print("Xổ số %s" % self.__province[ma])
            print(timeStr)
            for i, v in ketqua.items():
                print("%s: %s" % (i, v))
            tkdau = {}
            for elem in tree.xpath("//div[@class='span-5']//table[@class='bot']//tr"):
                dau = commonlib.getElementText(elem.xpath("./td[@class='bol tt1 f1b db']"))
                if dau != '': 
                    tkdau[dau] = commonlib.getElementText(elem.xpath("./td[@class='bor tt2 f1b tleft']"))
            tkdit = {}
            for elem in tree.xpath("//div[@class='span-5 last']//table[@class='bot']//tr"):
                dit = commonlib.getElementText(elem.xpath("./td[@class='bol tt1 f1b db']"))
                if dit != '': 
                    tkdit[dit] = commonlib.getElementText(elem.xpath("./td[@class='bor tt2 f1b tleft']"))
            
            data = {'_id': commonlib.getCRC32Unsign("%s - %s" % (ma, timeStr)),
                'name': "Xổ số %s" % self.__province[ma],
                'ma': ma,
                'mothuongngay': timeStr,
                'reporttime': self.standardizeTimeStr(timeStr),
                'ketqua': ketqua,
                'thongkedau': tkdau,
                'thongkedit': tkdit,
                'lastupdate': datetime.datetime.now(),
                'timestamp': time.time(),
                'region': self.__mien[mien]['name']
                }
            db = self.connection['xoso']
            collection = db['ketqua']
            collection.save(data)
            LOG.debug('start processXoso(%s)' % ma)
        except:
            LOG.error(traceback.format_exc())
        LOG.debug('finished processXoso(%s)' % ma)
    
    def thongKeTongHop(self, ma):
        LOG.debug('start thongKeTongHop(%s)' % ma)
        url = "http://ketqua.net/xo-so/thong-ke/thong-ke-tong-hop.php"
        delta = [[15, 'tk15ngay'], [30, 'tk30ngay'], [60, 'tke60ngay'], [90, 'tk90ngay']]
        typeTK = {'t1': ['Thống kê tổng chẵn', 'tongchan'], 't2': ['Thống kê tổng lẻ', 'tongle'], 't3': ['Thống kê bộ chẵn chẵn', 'bochanchan'], 
            't4': ['Thống kê bộ lẻ lẻ', 'bolele'], 't5': ['Thống kê bộ chẵn lẻ', 'bochanle'], 
            't6': ['Thống kê bộ lẻ chẵn', 'bolechan'], 't7': ['Thống kê bộ kép', 'bokep'], 't8': ['Thống kê bộ sát kép', 'bosatkep'],
            't11': ['Thống kê 15 số về nhiều nhất', '15sovenhieu'], 't12': ['Thống kê 15 số về ít nhất', '15soveit']
            }
        now = datetime.datetime.now()
        db = self.connection['xoso']
        collection = db['thongketonghop']
        t_data = {}
        for loaiThongKe, loaiThongKeName in typeTK.items():
            print loaiThongKeName[0], self.__province[ma]
            data = {}
            for d in delta:
                print d[1]
                tmp = now - datetime.timedelta(days=d[0])
                query = {'txtEnd': now.strftime("%d/%m/%Y"), 'txtStart': tmp.strftime("%d/%m/%Y"),
                    'rdType': 1, 'typeCollect': loaiThongKe, 'province': ma, 'cmdView': 'Xem kết quả'}
                tree = commonlib.getXMLTree(url, data=query)
                table = []
                for line in tree.xpath("//table[@class='bot space2']/tbody/tr"):
                    boso = commonlib.getElementText(line.xpath("./td[1]"))
                    ngayVeGanNhat = commonlib.getElementText(line.xpath("./td[2]"))
                    soLanXuatHien = commonlib.getElementText(line.xpath("./td[3]"))
                    soNgayChuaVe = commonlib.getElementText(line.xpath("./td[4]"))
                    table.append({'boso': boso, 'ngayVeGanNhat': ngayVeGanNhat, 'soLanXuatHien': soLanXuatHien, 'soNgayChuaVe': soNgayChuaVe})
                    print boso, ngayVeGanNhat, soLanXuatHien, soNgayChuaVe
                data[d[1]] = table
            t_data[loaiThongKeName[1]] = data
        result = {'_id': commonlib.getCRC32Unsign(self.__province[ma]),
            'data': t_data,
            'timestamp': time.time(),
            'lastupdate': datetime.datetime.now(),
            'name': self.__province[ma],
            'province': ma
            }
        collection.save(result)
        LOG.debug('finished thongKeTongHop(%s)' % ma)
    
    def thongKeMB(self):
        LOG.debug('start thongKeMB')
        url = "http://ketqua.net/xo-so/mien-bac/xo-so-truyen-thong.php"
        try:
            tree = commonlib.getXMLTree(url)
            content = tree.xpath("//div[@id='mien6']/div")
            xp = {'boSoNhieuNhat40': 'bộ số xuất hiện nhiều nhất',
                'boSoItNhat40': 'bộ số xuất hiện ít nhất',
                'loRoi40': 'lô rơi',
                'loKhan40': 'lô khan',
                'dauSo40': 'Thống kê đầu số',
                'ditSo40': 'Thống kê đít số'
                }
            data = []
            if len(content) > 0:
                announcementMsg = commonlib.getElementText(content)
                for v in xp.values():
                    d = tree.xpath("//h4/span[contains(., '{0}')]/../following-sibling::*[1]".format(v).decode('utf-8'))
                    dTitle = commonlib.getElementText(tree.xpath("//h4/span[contains(., '{0}')]".format(v).decode('utf-8')))
                    dData = commonlib.getElementText(d, descendant=1)
                    data.append({'title': dTitle, 'data': dData})
                    print(dTitle)
                    print(dData)
            tkmienbac = {'_id': commonlib.getCRC32Unsign('tkmienbac'),
                'announcementMsg': announcementMsg,
                'data': data,
                'timestamp': time.time(),
                'lastupdate': datetime.datetime.now()
                }
            db = self.connection['xoso']
            collection = db['thongkemienbac']
            collection.save(tkmienbac)
        except:
            LOG.error(traceback.format_exc())
        LOG.debug('finished thongKeMB')
    
    def processToday(self):
        LOG.debug('start processToday')
        o = self.dayOfWeek()
        for i in self.__open[o]:
            self.processXoso(i)
            self.thongKeTongHop(i)
        LOG.debug('finished processToday')
    
    def processAll(self):
        LOG.debug('start processAll')
        pool = workerpool.WorkerPool(size=10)
#        pool.map(self.processXoso, self.__province.keys())
        pool.map(self.thongKeTongHop, self.__province.keys())
        pool.shutdown()
        pool.wait()
        LOG.debug('finished processAll')
    
if __name__ == '__main__':
    
    LOG.info('start crawler ketqua.net')
    xs = KQNet()
#    xs.thongKeMB()
    xs.processAll()
    LOG.info('finished crawler ketqua.net at %s' % str(datetime.datetime.now()))
    os._exit(1)
    